package com.fucai.service;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fucai.controller.dto.CheckNumDTO;
import com.fucai.controller.dto.CheckOneNumOfOccurrencesDTO;
import com.fucai.controller.dto.SaveDataDTO;
import com.fucai.controller.dto.ZjLuStatisticsDTO;
import com.fucai.controller.vo.AddDatasVO;
import com.fucai.entity.Fucai3d;
import com.fucai.entity.Fucai3dBaiqiLu;
import com.fucai.mapper.Fucai3dBaiqiLuMapper;
import com.fucai.mapper.Fucai3dMapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @description:
 * @author: zhuchi
 * @create: 2024-03-24 13:05
 * @Version 1.0
 **/
@Service
public class Fucai3dService extends ServiceImpl<Fucai3dMapper, Fucai3d> {

    @Autowired
    private Fucai3dMapper fucai3dMapper;

    @Autowired
    private Fucai3dBaiqiLuMapper fucai3dBaiqiLuMapper;

    /**
     * 添加中奖信息
     * @return
     */
    public Integer addData(SaveDataDTO saveDataDTO) {
        Map<Integer, String> week = new HashMap<>();
        week.put(1, "一");
        week.put(2, "二");
        week.put(3, "三");
        week.put(4, "四");
        week.put(5, "五");
        week.put(6, "六");
        week.put(7, "日");
        DateTime date1 = DateUtil.parse(saveDataDTO.getKjDate());

        Integer kjXingqi = date1.dayOfWeek() - 1;
        if (kjXingqi == 0){
            kjXingqi = 7;
        }
        String weekZh = week.get(kjXingqi);
        saveDataDTO.setKjDate(saveDataDTO.getKjDate() + "(" + weekZh + ")");

        Fucai3d fucai3d = new Fucai3d();
        fucai3d.setId(this.getNewId());
        // 设置期号
        fucai3d.setQihao(saveDataDTO.getQihao());
        // 设置开奖日期
        fucai3d.setKjDate(saveDataDTO.getKjDate());
        // 星期几
        fucai3d.setKjXingqi(kjXingqi);

        String zj = saveDataDTO.getZj();
        StringBuffer stringBuffer = new StringBuffer();
        if (zj.contains(",")){
            String[] kjArray = zj.split(",");
            stringBuffer.append(kjArray[0]);
            stringBuffer.append(kjArray[1]);
            stringBuffer.append(kjArray[2]);
            zj = stringBuffer.toString();
        }
        // 设置中奖号码
        fucai3d.setZj(zj);

        // 设置开机号
        String kaijihao = saveDataDTO.getKj();
        fucai3d.setKj(kaijihao);

        // 设置试机号
        String shijihao = saveDataDTO.getSj();
        fucai3d.setSj(shijihao);

        // 计算各种信息：邻码、重码、孤码、跨度、和值等
        this.setCalculation(fucai3d);
        fucai3d.setCreateTime(new Date());

        int result = this.fucai3dMapper.insert(fucai3d);

        return result;
    }

    /**
     * 更新信息
     * @param fucai3d
     * @return
     */
    public Integer updateData(Fucai3d fucai3d) {
        // 计算各种信息：邻码、重码、孤码、跨度、和值等
        fucai3d = this.setCalculation(fucai3d);
        Integer result = this.fucai3dMapper.updateById(fucai3d);
        return result;
    }

    /**
     * 根据当前期号获取上期数据
     * @param qihao 期号
     * @return
     */
    public Fucai3d getShangqi(Integer qihao){
        if (String.valueOf(qihao).equals("2025001")){
            // 2024年最后一期为2024352，加一期，查询时会减一期
            qihao = 2024353;
        }
        LambdaQueryWrapper<Fucai3d> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Fucai3d::getQihao, (qihao - 1));
        Fucai3d fucai3d = this.fucai3dMapper.selectOne(queryWrapper);

        return fucai3d;
    }

    /**
     * 获取最新ID,根据已有最大ID加一
     * @return
     */
    public Integer getNewId(){
        LambdaQueryWrapper<Fucai3d> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByDesc(Fucai3d::getId);
        queryWrapper.last("limit 1");
        Fucai3d fucai3d = this.fucai3dMapper.selectOne(queryWrapper);
        if (null != fucai3d){
            return fucai3d.getId() + 1;
        }
        return 1;
    }

    /**
     * 获取最新一期数据
     * @return
     */
    public Fucai3d getNewData(){
        LambdaQueryWrapper<Fucai3d> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByDesc(Fucai3d::getId);
        queryWrapper.last("limit 1");
        Fucai3d fucai3d = this.fucai3dMapper.selectOne(queryWrapper);

        return fucai3d;
    }

    /**
     * 计算五型预测
     * @param fucai3d
     * @return
     */
    public Fucai3d wuxingYuce(Fucai3d fucai3d){
        String jin = "49";    // 金
        String mu = "38";     // 木
        String shui = "16";   // 水
        String huo = "27";    // 火
        String tu = "05";     // 土

        // 中奖百位五行和预测
        if (jin.contains(String.valueOf(fucai3d.getZjB()))){// 中奖号百位为“金”
            // 设置下期预测为“水木”（金生水、金克木）
            fucai3d.setBaiweiWuxing("金");
            fucai3d.setBaiweiWuxingYuceXiaqi("水木");
            fucai3d.setBaiweiWuxingYuceXiaqiHaoma(shui + mu);
        }else if (mu.contains(String.valueOf(fucai3d.getZjB()))){// 中奖号百位为“木”
            // 设置下期预测为“火土”（木生火、木克土）
            fucai3d.setBaiweiWuxing("木");
            fucai3d.setBaiweiWuxingYuceXiaqi("火土");
            fucai3d.setBaiweiWuxingYuceXiaqiHaoma(huo + tu);
        } else if (shui.contains(String.valueOf(fucai3d.getZjB()))){// 中奖号百位为“水”
            // 设置下期预测为“木火”（水生木、水克火）
            fucai3d.setBaiweiWuxing("水");
            fucai3d.setBaiweiWuxingYuceXiaqi("木火");
            fucai3d.setBaiweiWuxingYuceXiaqiHaoma(mu + huo);
        } else if (huo.contains(String.valueOf(fucai3d.getZjB()))){// 中奖号百位为“火”
            // 设置下期预测为“土金”（火生土、火克金）
            fucai3d.setBaiweiWuxing("火");
            fucai3d.setBaiweiWuxingYuceXiaqi("土金");
            fucai3d.setBaiweiWuxingYuceXiaqiHaoma(tu + jin);
        } else if (tu.contains(String.valueOf(fucai3d.getZjB()))){// 中奖号百位为“土”
            // 设置下期预测为“金水”（土生金、土克水）
            fucai3d.setBaiweiWuxing("土");
            fucai3d.setBaiweiWuxingYuceXiaqi("金水");
            fucai3d.setBaiweiWuxingYuceXiaqiHaoma(jin + shui);
        }

        // 中奖十位五行和预测
        if (jin.contains(String.valueOf(fucai3d.getZjS()))){// 中奖号百位为“金”
            // 设置下期预测为“水木”（金生水、金克木）
            fucai3d.setShiweiWuxing("金");
            fucai3d.setShiweiWuxingYuceXiaqi("水木");
            fucai3d.setShiweiWuxingYuceXiaqiHaoma(shui + mu);
        }else if (mu.contains(String.valueOf(fucai3d.getZjS()))){// 中奖号百位为“木”
            // 设置下期预测为“火土”（木生火、木克土）
            fucai3d.setShiweiWuxing("木");
            fucai3d.setShiweiWuxingYuceXiaqi("火土");
            fucai3d.setShiweiWuxingYuceXiaqiHaoma(huo + tu);
        } else if (shui.contains(String.valueOf(fucai3d.getZjS()))){// 中奖号百位为“水”
            // 设置下期预测为“木火”（水生木、水克火）
            fucai3d.setShiweiWuxing("水");
            fucai3d.setShiweiWuxingYuceXiaqi("木火");
            fucai3d.setShiweiWuxingYuceXiaqiHaoma(mu + huo);
        } else if (huo.contains(String.valueOf(fucai3d.getZjS()))){// 中奖号百位为“火”
            // 设置下期预测为“土金”（火生土、火克金）
            fucai3d.setShiweiWuxing("火");
            fucai3d.setShiweiWuxingYuceXiaqi("土金");
            fucai3d.setShiweiWuxingYuceXiaqiHaoma(tu + jin);
        } else if (tu.contains(String.valueOf(fucai3d.getZjS()))){// 中奖号百位为“土”
            // 设置下期预测为“金水”（土生金、土克水）
            fucai3d.setShiweiWuxing("土");
            fucai3d.setShiweiWuxingYuceXiaqi("金水");
            fucai3d.setShiweiWuxingYuceXiaqiHaoma(jin + shui);
        }

        // 中奖个位五行和预测
        if (jin.contains(String.valueOf(fucai3d.getZjG()))){// 中奖号百位为“金”
            // 设置下期预测为“水木”（金生水、金克木）
            fucai3d.setGeweiWuxing("金");
            fucai3d.setGeweiWuxingYuceXiaqi("水木");
            fucai3d.setGeweiWuxingYuceXiaqiHaoma(shui + mu);
        }else if (mu.contains(String.valueOf(fucai3d.getZjG()))){// 中奖号百位为“木”
            // 设置下期预测为“火土”（木生火、木克土）
            fucai3d.setGeweiWuxing("木");
            fucai3d.setGeweiWuxingYuceXiaqi("火土");
            fucai3d.setGeweiWuxingYuceXiaqiHaoma(huo + tu);
        } else if (shui.contains(String.valueOf(fucai3d.getZjG()))){// 中奖号百位为“水”
            // 设置下期预测为“木火”（水生木、水克火）
            fucai3d.setGeweiWuxing("水");
            fucai3d.setGeweiWuxingYuceXiaqi("木火");
            fucai3d.setGeweiWuxingYuceXiaqiHaoma(mu + huo);
        } else if (huo.contains(String.valueOf(fucai3d.getZjG()))){// 中奖号百位为“火”
            // 设置下期预测为“土金”（火生土、火克金）
            fucai3d.setGeweiWuxing("火");
            fucai3d.setGeweiWuxingYuceXiaqi("土金");
            fucai3d.setGeweiWuxingYuceXiaqiHaoma(tu + jin);
        } else if (tu.contains(String.valueOf(fucai3d.getZjG()))){// 中奖号百位为“土”
            // 设置下期预测为“金水”（土生金、土克水）
            fucai3d.setGeweiWuxing("土");
            fucai3d.setGeweiWuxingYuceXiaqi("金水");
            fucai3d.setGeweiWuxingYuceXiaqiHaoma(jin + shui);
        }

        String zjWuxing = fucai3d.getBaiweiWuxing() + fucai3d.getShiweiWuxing() + fucai3d.getGeweiWuxing();
        fucai3d.setZjWuxing(zjWuxing);
        return fucai3d;
    }

    /**
     * 计算各种信息
     * @param fucai3d
     * @return
     */
    public Fucai3d setCalculation(Fucai3d fucai3d) {
        int zjb = Integer.valueOf(String.valueOf(fucai3d.getZj().charAt(0)));
        int zjs = Integer.valueOf(String.valueOf(fucai3d.getZj().charAt(1)));
        int zjg = Integer.valueOf(String.valueOf(fucai3d.getZj().charAt(2)));

        fucai3d.setZjB(zjb);
        fucai3d.setZjS(zjs);
        fucai3d.setZjG(zjg);

        // 百位*3+3
        Integer baiwei3 = zjb * 3 + 3;
        fucai3d.setBaiwei3(baiwei3);
        fucai3d.setBaiwei3Ge(baiwei3 % 10);

        // 百位*7+7
        Integer baiwei7 = zjb * 7 + 7;
        fucai3d.setBaiwei7(baiwei7);
        fucai3d.setBaiwei7Ge(baiwei7 % 10);

        // 设置五行和预测
        this.wuxingYuce(fucai3d);

        // 设置和值
        fucai3d.setHezhi(fucai3d.getZjB()  + fucai3d.getZjS() + fucai3d.getZjG());
        // 设置和尾
        fucai3d.setHezhiWei(fucai3d.getHezhi() % 10);

        // 设置开机号百位、十位、个位、开机号和值
        String kjb = String.valueOf(fucai3d.getKj().charAt(0));
        String kjs = String.valueOf(fucai3d.getKj().charAt(1));
        String kjg = String.valueOf(fucai3d.getKj().charAt(2));
        fucai3d.setKjB(Integer.valueOf(kjb));
        fucai3d.setKjS(Integer.valueOf(kjs));
        fucai3d.setKjG(Integer.valueOf(kjg));
        fucai3d.setKjHezhi(fucai3d.getKjB() + fucai3d.getKjS() + fucai3d.getKjG());

        // 设置试机号百位、十位、个位、试机号和值
        String sjb = String.valueOf(fucai3d.getSj().charAt(0));
        String sjs = String.valueOf(fucai3d.getSj().charAt(1));
        String sjg = String.valueOf(fucai3d.getSj().charAt(2));
        fucai3d.setSjB(Integer.valueOf(sjb));
        fucai3d.setSjS(Integer.valueOf(sjs));
        fucai3d.setSjG(Integer.valueOf(sjg));
        fucai3d.setSjHezhi(fucai3d.getSjB() + fucai3d.getSjS() + fucai3d.getSjG());

        // 开奖日期尾号
        fucai3d.setKjDateWei(Integer.valueOf(String.valueOf(fucai3d.getKjDate()).substring(9, 10)));
        // 杀开奖日期尾号
        String kjDateWeiSha = fucai3d.getZj().contains(String.valueOf(fucai3d.getKjDateWei())) ? "不正确" :  "正确";;
        fucai3d.setKjDateWeiSha(kjDateWeiSha);

        // 设置期号尾号
        fucai3d.setQihaoWei(Integer.valueOf(String.valueOf(fucai3d.getQihao()).substring(6)));
        // 杀期号结果
        String qihaoWeiSha = fucai3d.getZj().contains(String.valueOf(fucai3d.getQihaoWei())) ? "不正确" :  "正确";
        fucai3d.setQihaoWeiSha(qihaoWeiSha);

        // 设置012路数量
        this.setLu(fucai3d);

        // 设置中奖号码路数
        this.setZjLu(fucai3d);

        // 杀中奖号码路数结果
        this.setZjLuStatisticsTopSha(fucai3d);

        // 设置大小
        StringBuffer daxiao = new StringBuffer();
        if (fucai3d.getZjB() > 4){
            daxiao.append("大");
        }else {
            daxiao.append("小");
        }
        if (fucai3d.getZjS() > 4){
            daxiao.append("大");
        }else {
            daxiao.append("小");
        }
        if (fucai3d.getZjG() > 4){
            daxiao.append("大");
        }else {
            daxiao.append("小");
        }
        fucai3d.setDaxiao(daxiao.toString());

        // 设置小中大
        StringBuffer xiaozhongda = new StringBuffer();
        if (fucai3d.getZjB() < 3){
            xiaozhongda.append("小");
        }else if (fucai3d.getZjB() >= 3 && fucai3d.getZjB() <= 6){
            xiaozhongda.append("中");
        }else {
            xiaozhongda.append("大");
        }
        if (fucai3d.getZjS() < 3){
            xiaozhongda.append(" 小");
        }else if (fucai3d.getZjS() >= 3 && fucai3d.getZjS() <= 6){
            xiaozhongda.append(" 中");
        }else {
            xiaozhongda.append(" 大");
        }
        if (fucai3d.getZjG() < 3){
            xiaozhongda.append(" 小");
        }else if (fucai3d.getZjG() >= 3 && fucai3d.getZjG() <= 6){
            xiaozhongda.append(" 中");
        }else {
            xiaozhongda.append(" 大");
        }
        fucai3d.setXiaozhongda(xiaozhongda.toString());

        String xingtai = "豹子";
        if (fucai3d.getZjB() == fucai3d.getZjS() && fucai3d.getZjS() == fucai3d.getZjG()){
            xingtai = "豹子";
        }else if (fucai3d.getZjB() == fucai3d.getZjS() || fucai3d.getZjS() == fucai3d.getZjG() || fucai3d.getZjB() == fucai3d.getZjG()){
            xingtai = "组三";
        }else {
            xingtai = "组六";
        }
        fucai3d.setXingtai(xingtai);

        // 设置奇偶
        List<Integer> jishu = Arrays.asList(1, 3, 5, 7, 9);
        String jiou = "";
        if (jishu.contains(fucai3d.getZjB())){
            jiou += "奇";
        }else {
            jiou += "偶";
        }
        if (jishu.contains(fucai3d.getZjS())){
            jiou += "奇";
        }else {
            jiou += "偶";
        }
        if (jishu.contains(fucai3d.getZjG())){
            jiou += "奇";
        }else {
            jiou += "偶";
        }
        fucai3d.setJiou(jiou);

        // 设置开机号跨度
        int kj_max = Math.max(fucai3d.getKjB(), Math.max(fucai3d.getKjS(), fucai3d.getKjG()));
        int kj_min = Math.min(fucai3d.getKjB(), Math.min(fucai3d.getKjS(), fucai3d.getKjG()));
        Integer kjKuadu = kj_max - kj_min;
        fucai3d.setKjKuadu(kjKuadu);

        // 设置试机号跨度
        int sj_max = Math.max(fucai3d.getSjB(), Math.max(fucai3d.getSjS(), fucai3d.getSjG()));
        int sj_min = Math.min(fucai3d.getSjB(), Math.min(fucai3d.getSjS(), fucai3d.getSjG()));
        Integer sjKuadu = sj_max - sj_min;
        fucai3d.setSjKuadu(sjKuadu);

        // 开机号和试机号一起算跨度
        int kjSjKuaduShengyu = Math.max(kj_max, sj_max) - Math.min(kj_min, sj_min);
        // 杀开机号和试机号一起算跨度
        String kjAndSjKuaduSha = fucai3d.getZj().contains(String.valueOf(kjSjKuaduShengyu)) ? "不正确" : "正确";
        fucai3d.setKjAndSjKuaduSha(kjAndSjKuaduSha);

        // 设置中奖号跨度
        int zj_max = Math.max(fucai3d.getZjB(), Math.max(fucai3d.getZjS(), fucai3d.getZjG()));
        int zj_min = Math.min(fucai3d.getZjB(), Math.min(fucai3d.getZjS(), fucai3d.getZjG()));
        Integer zjKuadu = zj_max - zj_min;
        fucai3d.setKuadu(zjKuadu);

        // 计算并设置断组-根据（和值加跨度取个位）定义断组
        setCalculationDuanzu(fucai3d);

        // 设置对应码
        String dy = this.getDy(fucai3d.getZj());
        fucai3d.setDy(dy);
        fucai3d.setDyB(Integer.valueOf(String.valueOf(dy.charAt(0))));
        fucai3d.setDyS(Integer.valueOf(String.valueOf(dy.charAt(1))));
        fucai3d.setDyG(Integer.valueOf(String.valueOf(dy.charAt(2))));

        // 设置邻码
        List<Integer> linArr = this.getLin(fucai3d.getZj());
        StringBuffer lin = new StringBuffer();
        for (Integer integer : linArr) {
            lin.append(integer);
        }
        fucai3d.setLin(lin.toString());
        // 邻码最少是2位,所以前两位不用判断数量
        fucai3d.setLin1(linArr.get(0));
        fucai3d.setLin2(linArr.get(1));
        if (linArr.size() > 2){
            fucai3d.setLin3(linArr.get(2));
        }
        if (linArr.size() > 3){
            fucai3d.setLin4(linArr.get(3));
        }
        if (linArr.size() > 4){
            fucai3d.setLin5(linArr.get(4));
        }
        if (linArr.size() > 5){
            fucai3d.setLin6(linArr.get(5));
        }

        // 设置孤码
        List<Integer> guArr = this.getGu(fucai3d.getZj());
        StringBuffer gu = new StringBuffer();
        for (Integer integer : guArr) {
            gu.append(integer);
        }
        fucai3d.setGu(gu.toString());
        // 孤最少是1位,所以第一位不用判断数量
        fucai3d.setGu1(guArr.get(0));
        if (guArr.size() > 1){
            fucai3d.setGu2(guArr.get(1));
        }
        if (guArr.size() > 2){
            fucai3d.setGu3(guArr.get(2));
        }
        if (guArr.size() > 3){
            fucai3d.setGu4(guArr.get(3));
        }
        if (guArr.size() > 4){
            fucai3d.setGu5(guArr.get(4));
        }
        if (guArr.size() > 5){
            fucai3d.setGu6(guArr.get(5));
        }
        if (guArr.size() > 6){
            fucai3d.setGu7(guArr.get(6));
        }

        // 杀开机试机跨度剩余
        String kjSjKuaduShaShengyu = "0123456789";
        kjSjKuaduShaShengyu = kjSjKuaduShaShengyu.replace(String.valueOf(fucai3d.getKjKuadu()), "");
        kjSjKuaduShaShengyu = kjSjKuaduShaShengyu.replace(String.valueOf(fucai3d.getSjKuadu()), "");
        fucai3d.setKjSjKuaduShaShengyu(kjSjKuaduShaShengyu);

        // 杀开机试机跨度结果
        String kjSjKuaduSha = "正确";
        // 中奖号码包含开机号跨度或者包含试机号跨度,即表示不正确
        if (fucai3d.getZj().contains(String.valueOf(fucai3d.getKjKuadu())) || fucai3d.getZj().contains(String.valueOf(fucai3d.getSjKuadu()))){
            kjSjKuaduSha = "不正确";
        }
        fucai3d.setKjSjKuaduSha(kjSjKuaduSha);

        String kjbSha = fucai3d.getZj().contains(String.valueOf(fucai3d.getKjB())) ? "不正确" : "正确";
        String kjsSha = fucai3d.getZj().contains(String.valueOf(fucai3d.getKjS())) ? "不正确" : "正确";
        String kjgSha = fucai3d.getZj().contains(String.valueOf(fucai3d.getKjG())) ? "不正确" : "正确";
        String kjKuaduSha = fucai3d.getZj().contains(String.valueOf(fucai3d.getKjKuadu())) ? "不正确" : "正确";
        String kjHeweiSha = fucai3d.getZj().contains(String.valueOf((fucai3d.getKjHezhi() % 10))) ? "不正确" : "正确";
        fucai3d.setKjbSha(kjbSha);
        fucai3d.setKjsSha(kjsSha);
        fucai3d.setKjgSha(kjgSha);
        fucai3d.setKjKuaduSha(kjKuaduSha);
        fucai3d.setKjHeweiSha(kjHeweiSha);

        //  杀试机号百位结果
        String sjbSha = fucai3d.getZj().contains(String.valueOf(fucai3d.getSjB())) ? "不正确" : "正确";
        // 杀试机号十位结果
        String sjsSha = fucai3d.getZj().contains(String.valueOf(fucai3d.getSjS())) ? "不正确" : "正确";
        // 杀试机号个位结果
        String sjgSha = fucai3d.getZj().contains(String.valueOf(fucai3d.getSjG())) ? "不正确" : "正确";
        // 杀试机号跨度结果
        String sjKuaduSha = fucai3d.getZj().contains(String.valueOf(fucai3d.getSjKuadu())) ? "不正确" : "正确";
        // 杀试机号和尾结果
        String sjHeweiSha = fucai3d.getZj().contains(String.valueOf((fucai3d.getSjHezhi() % 10))) ? "不正确" : "正确";
        fucai3d.setSjbSha(sjbSha);
        fucai3d.setSjsSha(sjsSha);
        fucai3d.setSjgSha(sjgSha);
        fucai3d.setSjKuaduSha(sjKuaduSha);
        fucai3d.setSjHeweiSha(sjHeweiSha);

        // 上期数据
        Fucai3d shangqiFucai3d = this.getShangqi(fucai3d.getQihao());

        if (null != shangqiFucai3d){
            // 设置重临孤对
            String clgd = this.getClgd(fucai3d, shangqiFucai3d);
            fucai3d.setClgd(clgd);

            // 设置和上期对比出现的重码
            String cm = this.getCm(shangqiFucai3d, fucai3d.getZjB(), fucai3d.getZjS(), fucai3d.getZjG());
            if (StringUtils.isNotBlank(cm)){
                fucai3d.setChong(cm);
                if (cm.length() > 0){
                    fucai3d.setCm1(Integer.valueOf(String.valueOf(cm.charAt(0))));
                }
                if (cm.length() > 1){
                    fucai3d.setCm2(Integer.valueOf(String.valueOf(cm.charAt(1))));
                }
                if (cm.length() > 3){
                    fucai3d.setCm3(Integer.valueOf(String.valueOf(cm.charAt(2))));
                }
            }

            // 断组是否正确
            String duanzuCorrect = "不正确";
            fucai3d.setDuanzuCorrect1(null);
            fucai3d.setDuanzuCorrect2(null);
            // 判断上期分析的断组数据第一组断组是否正确
            if (!shangqiFucai3d.getDuanzu1().contains(String.valueOf(fucai3d.getZjB())) &&
                    !shangqiFucai3d.getDuanzu1().contains(String.valueOf(fucai3d.getZjS()))&&
                    !shangqiFucai3d.getDuanzu1().contains(String.valueOf(fucai3d.getZjG()))){
                duanzuCorrect = "正确";
                fucai3d.setDuanzuCorrect1(shangqiFucai3d.getDuanzu1());
            }
            // 判断上期分析的断组数据第二组断组是否正确
            if (!shangqiFucai3d.getDuanzu2().contains(String.valueOf(fucai3d.getZjB())) &&
                    !shangqiFucai3d.getDuanzu2().contains(String.valueOf(fucai3d.getZjS()))&&
                    !shangqiFucai3d.getDuanzu2().contains(String.valueOf(fucai3d.getZjG()))){
                duanzuCorrect = "正确";
                if (StringUtils.isNotBlank(fucai3d.getDuanzuCorrect1())){
                    fucai3d.setDuanzuCorrect2(shangqiFucai3d.getDuanzu2());
                }else {
                    fucai3d.setDuanzuCorrect1(shangqiFucai3d.getDuanzu2());
                }
            }
            // 判断上期分析的断组数据第三组断组是否正确
            if (!shangqiFucai3d.getDuanzu3().contains(String.valueOf(fucai3d.getZjB())) &&
                    !shangqiFucai3d.getDuanzu3().contains(String.valueOf(fucai3d.getZjS()))&&
                    !shangqiFucai3d.getDuanzu3().contains(String.valueOf(fucai3d.getZjG()))){
                duanzuCorrect = "正确";
                if (StringUtils.isNotBlank(fucai3d.getDuanzuCorrect1())){
                    fucai3d.setDuanzuCorrect2(shangqiFucai3d.getDuanzu3());
                }else {
                    fucai3d.setDuanzuCorrect1(shangqiFucai3d.getDuanzu3());
                }
            }
            fucai3d.setDuanzuCorrect(duanzuCorrect);

            // 根据上期中奖号码、邻码、孤码判断断组
            String clgDuanzu = "不正确";// 重码邻码孤码断组
            String clgDuanzu1 = "";    // 重码邻码孤码断组1
            String clgDuanzu2 = "";    // 重码邻码孤码断组2
            // 上期邻码不包含本期中奖号码时,断组成功
            if (!shangqiFucai3d.getLin().contains(String.valueOf(fucai3d.getZjB())) && !shangqiFucai3d.getLin().contains(String.valueOf(fucai3d.getZjS())) && !shangqiFucai3d.getLin().contains(String.valueOf(fucai3d.getZjG()))){
                clgDuanzu = "正确";
                clgDuanzu1 = shangqiFucai3d.getLin();
            }
            // 上期中奖号码不包含本期中奖号码时,断组成功
            if (!shangqiFucai3d.getZj().contains(String.valueOf(fucai3d.getZjB())) && !shangqiFucai3d.getZj().contains(String.valueOf(fucai3d.getZjS())) && !shangqiFucai3d.getZj().contains(String.valueOf(fucai3d.getZjG()))){
                clgDuanzu = "正确";
                if (StringUtils.isBlank(clgDuanzu1)){
                    clgDuanzu1 = shangqiFucai3d.getZj();
                }else {
                    clgDuanzu2 = shangqiFucai3d.getZj();
                }
            }
            // 上期孤码不包含本期中奖号码时,断组成功
            if (!shangqiFucai3d.getGu().contains(String.valueOf(fucai3d.getZjB())) && !shangqiFucai3d.getGu().contains(String.valueOf(fucai3d.getZjS())) && !shangqiFucai3d.getGu().contains(String.valueOf(fucai3d.getZjG()))){
                clgDuanzu = "正确";
                if (StringUtils.isBlank(clgDuanzu1)){
                    clgDuanzu1 = shangqiFucai3d.getGu();
                }else {
                    clgDuanzu2 = shangqiFucai3d.getGu();
                }
            }
            fucai3d.setClgDuanzu(clgDuanzu);
            if (clgDuanzu.equals("正确")){
                fucai3d.setClgDuanzu1(clgDuanzu1);
                fucai3d.setClgDuanzu2(clgDuanzu2);
            }


            // 上期百位杀下期百位是否正确
            String bsb = shangqiFucai3d.getZjB() == fucai3d.getZjB() ? "不正确" : "正确";
            shangqiFucai3d.setBsb(bsb);

            // 上期百位杀下期十位是否正确
            String bss = shangqiFucai3d.getZjB() == fucai3d.getZjS() ? "不正确" : "正确";
            shangqiFucai3d.setBss(bss);

            // 上期百位杀下期个位是否正确
            String bsg = shangqiFucai3d.getZjB() == fucai3d.getZjG() ? "不正确" : "正确";
            shangqiFucai3d.setBsg(bsg);

            // 上期十位杀下期百位是否正确
            String ssb = shangqiFucai3d.getZjS() == fucai3d.getZjB() ? "不正确" : "正确";
            shangqiFucai3d.setSsb(ssb);

            // 上期十位杀下期十位是否正确
            String sss = shangqiFucai3d.getZjS() == fucai3d.getZjS() ? "不正确" : "正确";
            shangqiFucai3d.setSss(sss);

            // 上期十位杀下期个位是否正确
            String ssg = shangqiFucai3d.getZjS() == fucai3d.getZjG() ? "不正确" : "正确";
            shangqiFucai3d.setSsg(ssg);

            // 上期个位杀下期百位是否正确
            String gsb = shangqiFucai3d.getZjG() == fucai3d.getZjB() ? "不正确" : "正确";
            shangqiFucai3d.setGsb(gsb);

            // 上期个位杀下期十位是否正确
            String gss = shangqiFucai3d.getZjG() == fucai3d.getZjS() ? "不正确" : "正确";
            shangqiFucai3d.setGss(gss);

            // 上期个位杀下期个位是否正确
            String gsg = shangqiFucai3d.getZjG() == fucai3d.getZjG() ? "不正确" : "正确";
            shangqiFucai3d.setGsg(gsg);

            // 百位五行预测下期结果
            String baiweiWuxingYuceXiaqiResult = shangqiFucai3d.getBaiweiWuxingYuceXiaqiHaoma().contains(String.valueOf(fucai3d.getZjB())) ? "正确" : "不正确";
            shangqiFucai3d.setBaiweiWuxingYuceXiaqiResult(baiweiWuxingYuceXiaqiResult);

            // 十位五行预测下期结果
            String shiweiWuxingYuceXiaqiResult = shangqiFucai3d.getShiweiWuxingYuceXiaqiHaoma().contains(String.valueOf(fucai3d.getZjS())) ? "正确" : "不正确";
            shangqiFucai3d.setShiweiWuxingYuceXiaqiResult(shiweiWuxingYuceXiaqiResult);

            // 个位五行预测下期结果
            String geweiWuxingYuceXiaqiResult = shangqiFucai3d.getGeweiWuxingYuceXiaqiHaoma().contains(String.valueOf(fucai3d.getZjG())) ? "正确" : "不正确";
            shangqiFucai3d.setGeweiWuxingYuceXiaqiResult(geweiWuxingYuceXiaqiResult);

            // 更新上期数据中各位置杀下期数据
            this.fucai3dMapper.updateById(shangqiFucai3d);



            // 本期杀上期和尾
            String sqHezhiWeiSha = fucai3d.getZj().contains(String.valueOf(shangqiFucai3d.getHezhiWei())) ? "不正确" : "正确";
            fucai3d.setSqHezhiWeiSha(sqHezhiWeiSha);

            // 本期杀上期跨度
            String sqKuaduSha = fucai3d.getZj().contains(String.valueOf(shangqiFucai3d.getKuadu())) ? "不正确" : "正确";
            fucai3d.setSqKuaduSha(sqKuaduSha);

            // 本期杀上期试机号跨度
            String sqSjKuaduSha = fucai3d.getZj().contains(String.valueOf(shangqiFucai3d.getSjKuadu())) ? "不正确" : "正确";
            fucai3d.setSqSjKuaduSha(sqSjKuaduSha);

            // 计算星期定位杀结果（从左杀）
            String xingqiDingWeiShaAsc = this.jisuanXingqiSha(fucai3d, shangqiFucai3d);
            fucai3d.setXingqiDingWeiShaAsc(xingqiDingWeiShaAsc);

            // 杀期号定位杀结果
            String jisuanQihaoWeiDingWeiSha = this.jisuanQihaoWeiDingWeiSha(fucai3d, shangqiFucai3d);
            fucai3d.setQihaoWeiDingWeiSha(jisuanQihaoWeiDingWeiSha);

            // 杀上期百位*3+3个位结果
            String baiwei3Sha = fucai3d.getZj().contains(String.valueOf(shangqiFucai3d.getBaiwei3Ge())) ? "不正确" : "正确";
            fucai3d.setBaiwei3Sha(baiwei3Sha);

            // 杀上期百位*7+7个位结果
            String baiwei7Sha = fucai3d.getZj().contains(String.valueOf(shangqiFucai3d.getBaiwei7Ge())) ? "不正确" : "正确";
            fucai3d.setBaiwei7Sha(baiwei7Sha);

            // 上上期数据
            Fucai3d ssq = this.getShangqi(shangqiFucai3d.getQihao());
            if (null != ssq){
                // 上两期十位和值
                Integer shang2ShiHezhi = shangqiFucai3d.getZjS() + ssq.getZjS();
                fucai3d.setShang2ShiHezhi(shang2ShiHezhi);
                // 上两期十位和尾
                Integer shang2ShiHezhiWei = shang2ShiHezhi % 10;
                fucai3d.setShang2ShiHezhiWei(shang2ShiHezhiWei);

                // 杀上两期十位和尾结果
                String shang2ShiHezhiWeiSha = fucai3d.getZj().contains(String.valueOf(shang2ShiHezhiWei)) ? "不正确" : "正确";
                fucai3d.setShang2ShiHezhiWeiSha(shang2ShiHezhiWeiSha);
            }
        }

        return fucai3d;
    }

    /**
     * 按期尾定位杀结果
     * 123456789代表（百杀百、百杀十、百杀个、十杀百、十杀十、十杀个、个杀百、个杀十、个杀个）
     * 期尾0：1（百杀百）
     * 期尾1：1（百杀百）
     * 期尾2：2（百杀十）
     * 期尾3：3（百杀个）
     * 期尾4：4（十杀百）
     * 期尾5：5（十杀十）
     * 期尾6：6（十杀个）
     * 期尾7：7（个杀百）
     * 期尾8：8（个杀十）
     * 期尾9：9（个杀个）
     * @param fucai3d
     * @param shangqiFucai3d
     * @return
     */
    public String jisuanQihaoWeiDingWeiSha(Fucai3d fucai3d, Fucai3d shangqiFucai3d){
        // 按星期定位杀结果
        String xingqiDingWeiShaAsc = "不正确";
        if (fucai3d.getQihaoWei() == 0 || fucai3d.getQihaoWei() == 1){
            // 期尾0、1：1（百杀百）
            if (shangqiFucai3d.getZjB() != fucai3d.getZjB()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getQihaoWei() == 2){
            // 期尾2：2（百杀十）
            if (shangqiFucai3d.getZjB() != fucai3d.getZjS()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getQihaoWei() == 3){
            // 期尾3：3（百杀个）
            if (shangqiFucai3d.getZjB() != fucai3d.getZjG()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getQihaoWei() == 4){
            // 期尾4：4（十杀百）
            if (shangqiFucai3d.getZjS() != fucai3d.getZjB()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getQihaoWei() == 5){
            // 期尾5：5（十杀十）
            if (shangqiFucai3d.getZjS() != fucai3d.getZjS()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getQihaoWei() == 6){
            // 期尾6：6（十杀个）
            if (shangqiFucai3d.getZjS() != fucai3d.getZjG()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getQihaoWei() == 7){
            // 星期七使用：7（个杀百）
            if (shangqiFucai3d.getZjG() != fucai3d.getZjB()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getQihaoWei() == 8){
            // 星期七使用：7（个杀十）
            if (shangqiFucai3d.getZjG() != fucai3d.getZjS()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getQihaoWei() == 9){
            // 星期七使用：7（个杀个）
            if (shangqiFucai3d.getZjG() != fucai3d.getZjG()){
                xingqiDingWeiShaAsc = "正确";
            }
        }

        return xingqiDingWeiShaAsc;
    }

    /**
     * 计算星期定位杀结果
     * 123456789代表（百杀百、百杀十、百杀个、十杀百、十杀十、十杀个、个杀百、个杀十、个杀个）
     * 星期一使用：1（百杀百）
     * 星期二使用：2（百杀十）
     * 星期三使用：3（百杀个）
     * 星期四使用：4（十杀百）
     * 星期五使用：5（十杀十）
     * 星期六使用：6（十杀个）
     * 星期七使用：7（个杀百）
     * @param fucai3d
     * @param shangqiFucai3d
     * @return
     */
    public String jisuanXingqiSha(Fucai3d fucai3d, Fucai3d shangqiFucai3d){
        // 按星期定位杀结果
        String xingqiDingWeiShaAsc = "不正确";
        if (fucai3d.getKjXingqi() == 1){
            // 星期一使用：1（百杀百）
            if (shangqiFucai3d.getZjB() != fucai3d.getZjB()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getKjXingqi() == 2){
            // 星期二使用：2（百杀十）
            if (shangqiFucai3d.getZjB() != fucai3d.getZjB()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getKjXingqi() == 3){
            // 星期三使用：3（百杀个）
            if (shangqiFucai3d.getZjB() != fucai3d.getZjG()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getKjXingqi() == 4){
            // 星期四使用：4（十杀百）
            if (shangqiFucai3d.getZjS() != fucai3d.getZjB()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getKjXingqi() == 5){
            // 星期五使用：5（十杀十）
            if (shangqiFucai3d.getZjS() != fucai3d.getZjS()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getKjXingqi() == 6){
            // 星期六使用：6（十杀个）
            if (shangqiFucai3d.getZjS() != fucai3d.getZjG()){
                xingqiDingWeiShaAsc = "正确";
            }
        } else if (fucai3d.getKjXingqi() == 7){
            // 星期七使用：7（个杀百）
            if (shangqiFucai3d.getZjG() != fucai3d.getZjB()){
                xingqiDingWeiShaAsc = "正确";
            }
        }

        return xingqiDingWeiShaAsc;
    }


    /**
     * 设置012路
     * @param fucai3d
     * @return
     */
    public Fucai3d setLu(Fucai3d fucai3d){
        int lu0 = 0;
        int lu1 = 0;
        int lu2 = 0;
        if ("0369".contains(String.valueOf(fucai3d.getZjB()))){
            lu0++;
        }
        if ("147".contains(String.valueOf(fucai3d.getZjB()))){
            lu1++;
        }
        if ("258".contains(String.valueOf(fucai3d.getZjB()))){
            lu2++;
        }
        if ("0369".contains(String.valueOf(fucai3d.getZjS()))){
            lu0++;
        }
        if ("147".contains(String.valueOf(fucai3d.getZjS()))){
            lu1++;
        }
        if ("258".contains(String.valueOf(fucai3d.getZjS()))){
            lu2++;
        }
        if ("0369".contains(String.valueOf(fucai3d.getZjG()))){
            lu0++;
        }
        if ("147".contains(String.valueOf(fucai3d.getZjG()))){
            lu1++;
        }
        if ("258".contains(String.valueOf(fucai3d.getZjG()))){
            lu2++;
        }
        fucai3d.setLu0(lu0);
        fucai3d.setLu1(lu1);
        fucai3d.setLu2(lu2);

        return fucai3d;
    }

    /**
     * 设置中奖号码路数
     * @param fucai3d
     * @return
     */
    public Fucai3d setZjLu(Fucai3d fucai3d){
        String zjLu = "";
        int zjLuB = 0;
        int zjLuS = 0;
        int zjLuG = 0;
        if ("0369".contains(String.valueOf(fucai3d.getZjB()))){
            zjLuB = 0;
        }else if ("147".contains(String.valueOf(fucai3d.getZjB()))){
            zjLuB = 1;
        }else if ("258".contains(String.valueOf(fucai3d.getZjB()))){
            zjLuB = 2;
        }
        if ("0369".contains(String.valueOf(fucai3d.getZjS()))){
            zjLuS = 0;
        }else if ("147".contains(String.valueOf(fucai3d.getZjS()))){
            zjLuS = 1;
        }else if ("258".contains(String.valueOf(fucai3d.getZjS()))){
            zjLuS = 2;
        }
        if ("0369".contains(String.valueOf(fucai3d.getZjG()))){
            zjLuG = 0;
        }else if ("147".contains(String.valueOf(fucai3d.getZjG()))){
            zjLuG = 1;
        }else if ("258".contains(String.valueOf(fucai3d.getZjG()))){
            zjLuG = 2;
        }
        fucai3d.setZjLuB(zjLuB);
        fucai3d.setZjLuS(zjLuS);
        fucai3d.setZjLuG(zjLuG);
        zjLu = zjLuB + "" + zjLuS + "" + zjLuG;
        fucai3d.setZjLu(zjLu);

        return fucai3d;
    }

    /**
     * 设置中奖号码路数
     * @param fucai3d
     * @return
     */
    public Fucai3d setZjLuStatisticsTopSha(Fucai3d fucai3d){
        List<ZjLuStatisticsDTO> list = new ArrayList<>();
        if (null != fucai3d.getId()){
            list = this.fucai3dMapper.getZjLuStatistics(fucai3d.getId(), 100);
        }else {
            list = this.fucai3dMapper.getZjLuStatistics(null, 100);
        }

        if (!CollectionUtils.isEmpty(list)){
            List<Integer> quantityArr = list.stream().map(ZjLuStatisticsDTO::getBaiqiZjLuQuantity).collect(Collectors.toList());
            List<Integer> quchong = quantityArr.stream().distinct().collect(Collectors.toList());

            List<ZjLuStatisticsDTO> top1 = new ArrayList<>();
            List<ZjLuStatisticsDTO> top2 = new ArrayList<>();
            List<ZjLuStatisticsDTO> top3 = new ArrayList<>();

            if (quchong.size() > 0){
                int top1Quantity = quchong.get(0);
                for (ZjLuStatisticsDTO zjLuStatisticsDTO : list) {
                    if (zjLuStatisticsDTO.getBaiqiZjLuQuantity() == top1Quantity){
                        top1.add(zjLuStatisticsDTO);
                    }
                }
            }
            if (quchong.size() > 1){
                int top2Quantity = quchong.get(1);
                for (ZjLuStatisticsDTO zjLuStatisticsDTO : list) {
                    if (zjLuStatisticsDTO.getBaiqiZjLuQuantity() == top2Quantity){
                        top2.add(zjLuStatisticsDTO);
                    }
                }
            }
            if (quchong.size() > 2){
                int top3Quantity = quchong.get(2);
                for (ZjLuStatisticsDTO zjLuStatisticsDTO : list) {
                    if (zjLuStatisticsDTO.getBaiqiZjLuQuantity() == top3Quantity){
                        top3.add(zjLuStatisticsDTO);
                    }
                }
            }

            if (top1.size() > 0){
                // 杀前百期中奖号路数统计TOP1结果
                String luTop1Sha = "正确";
                for (ZjLuStatisticsDTO zjLuStatisticsDTO : top1) {
                    if (fucai3d.getZjLu().equals(zjLuStatisticsDTO.getBaiqiZjLu())){
                        luTop1Sha = "不正确";
                    }
                }
                fucai3d.setLuTop1Sha(luTop1Sha);
            }

            if (top2.size() > 0){
                String luTop2Sha = "正确";
                for (ZjLuStatisticsDTO zjLuStatisticsDTO : top2) {
                    if (fucai3d.getZjLu().equals(zjLuStatisticsDTO.getBaiqiZjLu())){
                        luTop2Sha = "不正确";
                    }
                }
                fucai3d.setLuTop2Sha(luTop2Sha);
            }

            if (top3.size() > 0){
                String luTop3Sha = "正确";
                for (ZjLuStatisticsDTO zjLuStatisticsDTO : top3) {
                    if (fucai3d.getZjLu().equals(zjLuStatisticsDTO.getBaiqiZjLu())){
                        luTop3Sha = "不正确";
                    }
                }
                fucai3d.setLuTop3Sha(luTop3Sha);
            }
        }

        if (fucai3d.getId() != null){
            LambdaQueryWrapper<Fucai3dBaiqiLu> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(Fucai3dBaiqiLu::getFucaiId, fucai3d.getId());
            List<Fucai3dBaiqiLu> fucai3dBaiqiLus = fucai3dBaiqiLuMapper.selectList(wrapper);

            if (CollectionUtils.isEmpty(fucai3dBaiqiLus)){
                Date  date = new Date();
                for (ZjLuStatisticsDTO zjLuStatisticsDTO : list) {
                    Fucai3dBaiqiLu baiqiLu = new Fucai3dBaiqiLu();
                    baiqiLu.setFucaiId(fucai3d.getId());
                    baiqiLu.setBaiqiZjLu(zjLuStatisticsDTO.getBaiqiZjLu());
                    baiqiLu.setBaiqiZjLuQuantity(zjLuStatisticsDTO.getBaiqiZjLuQuantity());
                    baiqiLu.setCreateTime(date);
                    this.fucai3dBaiqiLuMapper.insert(baiqiLu);
                }
            }
        }

        return fucai3d;
    }

    /**
     * 计算重邻孤对
     * @param fucai3d
     * @param shangqiFucai3d 上期信息
     * @return
     */
    public String getClgd(Fucai3d fucai3d, Fucai3d shangqiFucai3d){
        int zjb = fucai3d.getZjB();
        int zjs = fucai3d.getZjS();
        int zjg = fucai3d.getZjG();
        StringBuffer clgd = new StringBuffer();
        if (null != shangqiFucai3d){
            if (shangqiFucai3d.getZj().contains(String.valueOf(zjb)) || shangqiFucai3d.getZj().contains(String.valueOf(zjs)) || shangqiFucai3d.getZj().contains(String.valueOf(zjg))){
                clgd.append("重");
            }
            if (shangqiFucai3d.getLin().contains(String.valueOf(zjb)) || shangqiFucai3d.getLin().contains(String.valueOf(zjs)) || shangqiFucai3d.getLin().contains(String.valueOf(zjg))){
                clgd.append("邻");
            }
            if (shangqiFucai3d.getGu().contains(String.valueOf(zjb)) || shangqiFucai3d.getGu().contains(String.valueOf(zjs)) || shangqiFucai3d.getGu().contains(String.valueOf(zjg))){
                clgd.append("孤");
            }
            if (shangqiFucai3d.getDy().contains(String.valueOf(zjb)) || shangqiFucai3d.getDy().contains(String.valueOf(zjs)) || shangqiFucai3d.getDy().contains(String.valueOf(zjg))){
                clgd.append("对");
            }

            return clgd.toString();
        }

        return null;
    }

    /**
     * 计算重码
     * @param shangqiFucai3d 上期开奖信息
     * @param zjb 中奖百位
     * @param zjs 中奖十位
     * @param zjg 中奖个位
     * @return
     */
    public String getCm(Fucai3d shangqiFucai3d, int zjb, int zjs, int zjg){
        StringBuffer cm = new StringBuffer();
        if (null != shangqiFucai3d){
            if (shangqiFucai3d.getZj().contains(String.valueOf(zjb))){
                cm.append(zjb);
            }

            if (shangqiFucai3d.getZj().contains(String.valueOf(zjs))){
                cm.append(zjs);
            }

            if (shangqiFucai3d.getZj().contains(String.valueOf(zjg))){
                cm.append(zjg);
            }

            return cm.toString();
        }

        return null;
    }

    /**
     * 根据开奖码获取对应码
     * @param kj 如:158,返回:603
     * @return
     */
    public String getDy(String kj){
        Integer b = Integer.valueOf(String.valueOf(kj.charAt(0)));
        Integer s = Integer.valueOf(String.valueOf(kj.charAt(1)));
        Integer g = Integer.valueOf(String.valueOf(kj.charAt(2)));

        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(this.jsDy(b));
        stringBuffer.append(this.jsDy(s));
        stringBuffer.append(this.jsDy(g));

        return stringBuffer.toString();
    }

    /**
     * 计算对应码
     * @param n
     * @return
     */
    public Integer jsDy(Integer n){
        if (n == 0){
            return 5;
        }else if (n == 1){
            return 6;
        }else if (n == 2){
            return 7;
        }else if (n == 3){
            return 8;
        }else if (n == 4){
            return 9;
        }else if (n == 5){
            return 0;
        }else if (n == 6){
            return 1;
        }else if (n == 7){
            return 2;
        }else if (n == 8){
            return 3;
        }else if (n == 9){
            return 4;
        }
        return null;
    }

    /**
     * 根据开奖码获取临码
     * @param kj 如:158,返回:024679
     * @return
     */
    public List<Integer> getLin(String kj){
        Integer b = Integer.valueOf(String.valueOf(kj.charAt(0)));
        Integer s = Integer.valueOf(String.valueOf(kj.charAt(1)));
        Integer g = Integer.valueOf(String.valueOf(kj.charAt(2)));
        List<Integer> chong = new ArrayList<>();
        chong.add(b);
        chong.add(s);
        chong.add(g);

        List<Integer> arr = new ArrayList<>();

        for (Integer lin : this.jsLin(b)) {
            if (!arr.contains(lin) && !chong.contains(lin)){
                arr.add(lin);
            }
        }
        for (Integer lin : this.jsLin(s)) {
            if (!arr.contains(lin) && !chong.contains(lin)){
                arr.add(lin);
            }
        }
        for (Integer lin : this.jsLin(g)) {
            if (!arr.contains(lin) && !chong.contains(lin)){
                arr.add(lin);
            }
        }
        Collections.sort(arr);

        return arr;
    }

    /**
     * 计算临码
     * @param n
     * @return
     */
    public List<Integer> jsLin(Integer n){
        List<Integer> arr = new ArrayList<>();
        if (n == 0){
            arr.add(1);
            arr.add(9);
        }else if (n == 1){
            arr.add(0);
            arr.add(2);
        }else if (n == 2){
            arr.add(1);
            arr.add(3);
        }else if (n == 3){
            arr.add(2);
            arr.add(4);
        }else if (n == 4){
            arr.add(3);
            arr.add(5);
        }else if (n == 5){
            arr.add(4);
            arr.add(6);
        }else if (n == 6){
            arr.add(5);
            arr.add(7);
        }else if (n == 7){
            arr.add(6);
            arr.add(8);
        }else if (n == 8){
            arr.add(7);
            arr.add(9);
        }else if (n == 9){
            arr.add(0);
            arr.add(8);
        }
        return arr;
    }

    /**
     * 根据开奖码获取孤码
     * @param kj 如:158
     * @return 返回:3
     */
    public List<Integer> getGu(String kj){
        Integer b = Integer.valueOf(String.valueOf(kj.charAt(0)));
        Integer s = Integer.valueOf(String.valueOf(kj.charAt(1)));
        Integer g = Integer.valueOf(String.valueOf(kj.charAt(2)));

        List<Integer> arr = new ArrayList<>();
        arr.add(b);
        arr.add(s);
        arr.add(g);
        arr.addAll(this.getLin(kj));

        List<Integer> result = new ArrayList<>();
        if (!arr.contains(0)){
            result.add(0);
        }
        if (!arr.contains(1)){
            result.add(1);
        }
        if (!arr.contains(2)){
            result.add(2);
        }
        if (!arr.contains(3)){
            result.add(3);
        }
        if (!arr.contains(4)){
            result.add(4);
        }
        if (!arr.contains(5)){
            result.add(5);
        }
        if (!arr.contains(6)){
            result.add(6);
        }
        if (!arr.contains(7)){
            result.add(7);
        }
        if (!arr.contains(8)){
            result.add(8);
        }
        if (!arr.contains(9)){
            result.add(9);
        }

        Collections.sort(result);

        return result;
    }

    /**
     * 校验所选号码
     * @param checkNumDTO
     * @return
     */
    public List<Fucai3d> checkNum(CheckNumDTO checkNumDTO){
        LambdaQueryWrapper<Fucai3d> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (null != checkNumDTO.getCheckSort() && checkNumDTO.getCheckSort() == true){
            lambdaQueryWrapper.eq(Fucai3d::getZj, checkNumDTO.getKj());
        }else {
            lambdaQueryWrapper.like(Fucai3d::getZj, checkNumDTO.getKj().charAt(0));
            lambdaQueryWrapper.like(Fucai3d::getZj, checkNumDTO.getKj().charAt(1));
            lambdaQueryWrapper.like(Fucai3d::getZj, checkNumDTO.getKj().charAt(2));
        }
        lambdaQueryWrapper.orderByDesc(Fucai3d::getId);
        List<Fucai3d> fucai3ds = this.fucai3dMapper.selectList(lambdaQueryWrapper);

        return fucai3ds;
    }

    /**
     * 统计某个数字出现的次数
     * @param dto
     * @return
     */
    public List<Fucai3d> checkOneNumOfOccurrences(CheckOneNumOfOccurrencesDTO dto){
        LambdaQueryWrapper<Fucai3d> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.like(Fucai3d::getZj, dto.getNum());
        lambdaQueryWrapper.orderByDesc(Fucai3d::getId);
        if (null != dto.getQishu()){
            LambdaQueryWrapper<Fucai3d> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.orderByDesc(Fucai3d::getId);
            queryWrapper.last("limit " + dto.getQishu());
            List<Fucai3d> qishuData = this.fucai3dMapper.selectList(queryWrapper);
            List<Integer> ids = qishuData.stream().map(Fucai3d::getId).collect(Collectors.toList());
            lambdaQueryWrapper.in(Fucai3d::getId, ids);
        }
        List<Fucai3d> fucai3ds = this.fucai3dMapper.selectList(lambdaQueryWrapper);

        return fucai3ds;
    }

    /**
     * 根据选定号码组号
     * @param numbers 选定的号码
     * @param baozi 是否算入豹子号true:算入,false:不算入
     * @return
     */
    public List<String> groupNum(List<Integer> numbers, boolean baozi){
        List<String> groups = new ArrayList<>();

        if (!CollectionUtils.isEmpty(numbers) && numbers.size() < 3){
            if (numbers.size() == 0){
                return groups;
            }else if (numbers.size() == 1){
                groups.add(String.valueOf(numbers.get(0)));
                return groups;
            }else if (numbers.size() == 2){
                groups.add(String.valueOf(numbers.get(0)) + numbers.get(1));
                groups.add(String.valueOf(numbers.get(1)) + numbers.get(0));
                return groups;
            }
        }
        // 是否算入豹子号true:算入,false:不算入
        if (baozi){
            for (Integer number : numbers) {
                StringBuffer str = new StringBuffer();
                str.append(number);
                str.append(number);
                str.append(number);
                groups.add(str.toString());
            }
        }
        for (int b = 0; b < numbers.size(); b++){
            for (int s = 0; s < numbers.size(); s++){
                for (int g = 0; g < numbers.size(); g++){
                    StringBuffer str = new StringBuffer();
                    if (b != s && s != g && b != g){
                        str.append(numbers.get(b));
                        str.append(numbers.get(s));
                        str.append(numbers.get(g));
                        if (!groups.contains(str.toString())){
                            groups.add(str.toString());
                        }
                    }
                }
            }
        }

        return groups;
    }

    /**
     * 计算并设置断组-根据（和值加跨度取个位）定义断组
     * @return
     */
    public Fucai3d setCalculationDuanzu(Fucai3d fucai3d){
        // 设置和值加跨度个位
        Integer hezhiKuaduGewei = (fucai3d.getHezhi() + fucai3d.getKuadu()) % 10;
        fucai3d.setHezhiKuaduGewei(hezhiKuaduGewei);

        String duanzuOne = "";//断组1
        String duanzuTwo = "";//断组2
        String duanzuThree = "";//断组3
        // 根据（和值加跨度取个位）定义断组
        if (hezhiKuaduGewei == 0 || hezhiKuaduGewei == 5){
            duanzuOne = "019";
            duanzuTwo = "2378";
            duanzuThree = "456";
        }else if (hezhiKuaduGewei == 1 || hezhiKuaduGewei == 6){
            duanzuOne = "012";
            duanzuTwo = "3489";
            duanzuThree = "567";
        }else if (hezhiKuaduGewei == 2 || hezhiKuaduGewei == 7){
            duanzuOne = "123";
            duanzuTwo = "0459";
            duanzuThree = "678";
        }else if (hezhiKuaduGewei == 3 || hezhiKuaduGewei == 8){
            duanzuOne = "234";
            duanzuTwo = "0156";
            duanzuThree = "789";
        }else if (hezhiKuaduGewei == 4 || hezhiKuaduGewei == 9){
            duanzuOne = "345";
            duanzuTwo = "1267";
            duanzuThree = "089";
        }
        fucai3d.setDuanzu1(duanzuOne);
        fucai3d.setDuanzu2(duanzuTwo);
        fucai3d.setDuanzu3(duanzuThree);
        return fucai3d;
    }

    /**
     * 中奖号路数占比统计
     * @param id 从哪一期开始往前
     * @param qiQuantity 往前查询期数
     * @return
     */
    public List<ZjLuStatisticsDTO> getZjLuStatistics(Integer id, Integer qiQuantity){
        List<ZjLuStatisticsDTO> list = this.fucai3dMapper.getZjLuStatistics(id, qiQuantity);
        return list;
    }

    /**
     * 添加近期信息
     * @param vo
     * @return
     */
    public Integer addDatas(AddDatasVO vo){
        Map<String, String> kaijiDatas = new HashMap<>();
        Map<String, String> shijiDatas = new HashMap<>();
        List<String> ksjDatas = Arrays.asList(vo.getKaijiDatas().split(","));
        for (String ksj : ksjDatas) {
            String qihao = ksj.substring(0, 7);
            String kj = ksj.substring(7, 10);
            String sj = ksj.substring(10, 13);
            kaijiDatas.put(qihao, kj);
            shijiDatas.put(qihao, sj);
        }

        Integer result = 0;
        JSONArray jsonArray = vo.getDatas().getJSONArray("result");

        Collections.reverse(jsonArray);
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            SaveDataDTO saveDataDTO = new SaveDataDTO();
            saveDataDTO.setQihao(jsonObject.getInteger("code"));
            saveDataDTO.setZj(jsonObject.getString("red"));
            saveDataDTO.setKjDate(jsonObject.getString("date").substring(0, 10));
            saveDataDTO.setKj(kaijiDatas.get(jsonObject.getString("code")));
            saveDataDTO.setSj(shijiDatas.get(jsonObject.getString("code")));
            this.addData(saveDataDTO);
            result++;
        }

        return result;
    }

    /**
     * 获取近多少期数据
     * @param quantity 数量
     * @return
     */
    public List<Fucai3d> getFucai3dListByStartId(Integer quantity){
        Integer startId = this.fucai3dMapper.getStartId(quantity);
        LambdaQueryWrapper<Fucai3d> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.gt(Fucai3d::getId, startId);

        List<Fucai3d> fucai3ds = this.baseMapper.selectList(queryWrapper);
        return fucai3ds;
    }
}
